﻿#pragma once

#include "Block.h"
#include <vector>
#include <map>
#include <memory>

using namespace std;

class BlockAreaController
{
public:
	BlockAreaController();
	BlockAreaController( CWnd* window );
	~BlockAreaController();
protected:
	vector< vector<CBlock*> >		m_vBlockArea;	//场地容器，共有m_BlockNumY行，m_BlockNumX列
	map<int, auto_ptr<CBlock> >		m_mBlockMap;	//所有块按照ID索引，用于通过ID找到对象
	vector<CBlock*>					m_vRoundBlocks;	//四周的块
	CWnd*	m_pParent;
	CPoint	m_CurrentClickedBlockPos;		//上一个被点击的按钮位置
	CPoint	AreaPosition;					//整个BAC在窗口中的位置
	CSize	BlockSize;						//每个按钮的大小
	int		m_BlockNum;						//按钮数量
	int		m_BlockNumX;					//每行
	int		m_BlockNumY;					//每列
	int		m_nCurrentMineNum;				//目前剩余雷数
	int		m_nMineNum;						//总雷数
	bool	m_bDidMakeMine;					//已经布雷
	bool	m_bDidCreateBlocks;				//已经初始化
	UINT	m_nLastRDownBlockuId;			//
	UINT	m_nLastLDownBlockuId;			//
	AreaEventId m_aeLastEvent;				//最后事件

	CBlock* FindBlock(const UINT uId){return m_mBlockMap[uId].get();}
	CPoint TransformID( UINT uID )const;							//uID到位置
	UINT TransformID( CPoint *lpPoint )const;						//位置到uID
	void GetBlocksAround(UINT uId);
	vector<CBlock*> GetUnOpenedAround(UINT uId);
	int GetAroundMineNum();
	int GetAroundFlagNum();
	void RebuildAreaByMap( int BlockNum_X , int BlockNum_Y );		//按照场地大小重新排列按钮
	void ResizeMap( map<int, auto_ptr<CBlock> >::size_type NewSize);//重新调整场地大小
	void ReInitialization();										//让局部变量恢复初始状态
	void NonMine(UINT uId);
	void MakeMine(int nMineNum, UINT uId);
	void Event(AreaEventId);										//发生事件
	/* 重新创建场地!!仅用于被CreateBlocks调用 */
	void ReCreateBlocks( int& nMineNum, int& BlockNum_X, int& BlockNum_Y, int& BlockSize_X, int& BlockSize_Y , int& Area_X , int& Area_Y );
public:
	void BindWindow(CWnd* window){m_pParent = window;}				//把一个窗口绑定到BAC，但是不能重新换窗口
	void ShowArea();												//显示场地
	void HideArea();												//不显示场地
	/* 创建场地（初始化） */
	void CreateBlocks( int nMineNum, int BlockNum_X, int BlockNum_Y, int BlockSize_X, int BlockSize_Y , int Area_X , int Area_Y );
	/* 重新创建场地（新开游戏，不能调整场地大小、雷数目等） */
	void ResetBlocks( int nMineNum = -1 );
	/* 释放内存 */
	void ClearBlocks();
	void CheckMine(UINT uId);
	void LRButtonCheackMine(UINT uId);
	void CheckedBlock(UINT uId);
	void PressDown(UINT uId);
	void ReleasUp(UINT uId);
	void CheckBlockRDown(UINT uId);	//解决部分按键BUG
	void CheckBlockLDown(UINT uId);
	void LRPressDown(UINT uId);	//按下效果，有些隐含BUG
	void LRReleasUp(UINT uId);

	const AreaEventId& GetLastEvent()const;
	void ClearEvent();
	//TODO:把各种信息汇总汇报给GS的接口留出来，当前剩余雷数，当前旗数，触雷事件，全块翻开事件等

	int GetCurrentMineNum(){return m_nCurrentMineNum;}
};
